--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
meshchatx/src/backend/rrc/server.py 7eea421940d2baf28e6476c2736f889f5f3657a4 (7eea4219) Text, 42.95 KB
T8b949e# SPDX-License-Identifier: 0BSD
T8b949e"""Reticulum Relay Chat hub hosting.
Provides :class:`RRCHubServer`, a self-contained RRC hub that listens on a
Reticulum destination and relays messages between connected clients, and
:class:`RRCServerManager`, which lets a node host several independent hubs and
manage their public rooms. The wire behaviour mirrors the reference rrcd hub so
standard RRC clients (including the MeshChatX client) can connect.
"""
Tff7b72import T7ee787contextlib
Tff7b72import T7ee787os
Tff7b72import T7ee787threading
Tff7b72import T7ee787time
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72import T7ee787RNS
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrc Tff7b72import Te6edf3protocol Tff7b72as Te6edf3proto
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787hub_commands Tff7b72import Te6edf3HubCommandHandler
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787hub_policy Tff7b72import Te6edf3HubPolicy
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787identity_util Tff7b72import Te6edf3parse_identity_hash
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787room_registry Tff7b72import Te6edf3RoomRegistry
Tff7b72from T7ee787meshchatxT7ee787.T7ee787srcT7ee787.T7ee787backendT7ee787.T7ee787rrcT7ee787.T7ee787rooms_toml Tff7b72import Te6edf3RoomsTomlStore
Te6edf3SERVER_DIR_NAME Tff7b72= Ta5d6ff"Ta5d6ffrrc_serverTa5d6ff"
Te6edf3MESSAGE_LOG_CAP Tff7b72= T79c0ff5000
Te6edf3STORE_FILENAME Tff7b72= Ta5d6ff"Ta5d6ffhubsTa5d6ff"
Te6edf3HUB_CONFIG_FILENAME Tff7b72= Ta5d6ff"Ta5d6ffhub.tomlTa5d6ff"
Te6edf3ROOMS_FILENAME Tff7b72= Ta5d6ff"Ta5d6ffrooms.tomlTa5d6ff"
Tff7b72class T56d364_LoopbackEndpointTb4b4b4:
T8b949e"""In-process link bridging a local client hub to a hosted hub server.
Reticulum does not loop packets back to destinations hosted within the same
instance, so connecting to a locally hosted hub goes through this direct
bridge instead of the mesh. It exposes just enough of the
:class:`RNS.Link` surface for both sides to treat it like a link.
"""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3client_hubTb4b4b4, Te6edf3serverTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVE
Tff7b72selfTff7b72.Td2a8ff_client Tff7b72= Te6edf3client_hub
Tff7b72selfTff7b72.Td2a8ff_server Tff7b72= Te6edf3server
Tff7b72selfTff7b72.Td2a8ff_closed Tff7b72= Tff7b72False
Tff7b72def Td2a8ffget_remote_identityTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ff_clientTff7b72.Td2a8ffmanagerTff7b72.Td2a8ffidentity
Tff7b72def Td2a8fffrom_clientTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_closedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_serverTff7b72.Td2a8ff_on_packetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72def Td2a8fffrom_serverTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_closedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_clientTff7b72.Td2a8ff_on_packetTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72def Td2a8ffteardownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_closedTb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_closed Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffstatus Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffCLOSED
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_serverTff7b72.Td2a8ff_detach_loopbackTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_clientTff7b72.Td2a8ff_on_closedTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72class T56d364_SessionTb4b4b4:
T8b949e"""Per-link client session state."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwelcomed Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffpeer Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffnick Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrooms Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftokens Tff7b72= Tffa657floatTb4b4b4(Te6edf3protoTff7b72.Td2a8ffDEFAULT_RATE_PER_MINUTETb4b4b4)
Tff7b72selfTff7b72.Td2a8fflast_refill Tff7b72= Te6edf3timeTff7b72.Td2a8ffmonotonicTb4b4b4(Tb4b4b4)
Tff7b72class T56d364RRCHubServerTb4b4b4:
T8b949e"""A single hosted RRC hub with its own Reticulum identity and rooms."""
Tff7b72def Tff7b72__init__Tb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3managerTb4b4b4,
Te6edf3identityTb4b4b4,
Te6edf3nameTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3greetingTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3announceTff7b72=Tff7b72TrueTb4b4b4,
Te6edf3enabledTff7b72=Tff7b72TrueTb4b4b4,
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffmanager Tff7b72= Te6edf3manager
Tff7b72selfTff7b72.Td2a8ffidentity Tff7b72= Te6edf3identity
Tff7b72selfTff7b72.Td2a8ffhub_id Tff7b72= Te6edf3identityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3name Tff7b72or Tb4b4b4(Ta5d6ff"Ta5d6ffHub Ta5d6ff" Tff7b72+ Te6edf3identityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff8Tb4b4b4]Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffgreeting Tff7b72= Te6edf3greeting
Tff7b72selfTff7b72.Td2a8ffannounce Tff7b72= Te6edf3announce
Tff7b72selfTff7b72.Td2a8ffenabled Tff7b72= Te6edf3enabled
Tff7b72selfTff7b72.Td2a8ffmax_nick_bytes Tff7b72= Te6edf3protoTff7b72.Td2a8ffDEFAULT_MAX_NICK_BYTES
Tff7b72selfTff7b72.Td2a8ffmax_room_name_bytes Tff7b72= Te6edf3protoTff7b72.Td2a8ffDEFAULT_MAX_ROOM_BYTES
Tff7b72selfTff7b72.Td2a8ffmax_msg_body_bytes Tff7b72= Te6edf3protoTff7b72.Td2a8ffDEFAULT_MAX_MSG_BYTES
Tff7b72selfTff7b72.Td2a8ffmax_rooms_per_session Tff7b72= Te6edf3protoTff7b72.Td2a8ffDEFAULT_MAX_ROOMS
Tff7b72selfTff7b72.Td2a8ffrate_limit_msgs_per_minute Tff7b72= Te6edf3protoTff7b72.Td2a8ffDEFAULT_RATE_PER_MINUTE
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrunning Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_started_at Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffRLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sessions Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_room_members Tff7b72= Tb4b4b4{Tb4b4b4}
Tff7b72selfTff7b72.Td2a8ff_hub_dir Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffpolicy Tff7b72= Te6edf3HubPolicyTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrooms Tff7b72= Te6edf3RoomRegistryTb4b4b4(Tff7b72selfTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_commands Tff7b72= Te6edf3HubCommandHandlerTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_message_log Tff7b72= Te6edf3dequeTb4b4b4(Te6edf3maxlenTff7b72=Te6edf3MESSAGE_LOG_CAPTb4b4b4)
Tf0883e@property
Tff7b72def Td2a8ffdest_hashTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffhash
Tff7b72return Tff7b72None
Tff7b72def Td2a8ff_logTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3msgTb4b4b4, Te6edf3levelTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3level Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3level Tff7b72= Te6edf3RNSTff7b72.Td2a8ffLOG_INFO
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ff[RRC hub Ta5d6ff" Tff7b72+ Tff7b72selfTff7b72.Td2a8ffname Tff7b72+ Ta5d6ff"Ta5d6ff] Ta5d6ff" Tff7b72+ Te6edf3msgTb4b4b4, Te6edf3levelTb4b4b4)
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrunningTb4b4b4:
Tff7b72return
Te6edf3app_nameTb4b4b4, Te6edf3aspects Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffapp_and_aspects_from_nameTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffDEFAULT_DEST_NAMETb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Te6edf3RNSTff7b72.Td2a8ffDestinationTb4b4b4(
Tff7b72selfTff7b72.Td2a8ffidentityTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffINTb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffDestinationTff7b72.Td2a8ffSINGLETb4b4b4,
Te6edf3app_nameTb4b4b4,
Tff7b72*Te6edf3aspectsTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffset_link_established_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_on_linkTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrunning Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ff_started_at Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffannounceTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffannounce_nowTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_logTb4b4b4(Ta5d6ff"Ta5d6ffhub started at Ta5d6ff" Tff7b72+ Tff7b72selfTff7b72.Td2a8ffdest_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ffannounce_nowTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffannounceTb4b4b4(
Te6edf3app_dataTff7b72=Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffprotoTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffrrcTa5d6ff"Tb4b4b4, Ta5d6ff"Ta5d6ffvTa5d6ff"Tb4b4b4: T79c0ff1Tb4b4b4, Ta5d6ff"Ta5d6ffhubTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4}Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3links Tff7b72= Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffclearTb4b4b4(Tb4b4b4)
Te6edf3dest Tff7b72= Tff7b72selfTff7b72.Td2a8ffdestination
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffrunning Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_started_at Tff7b72= Tff7b72None
Tff7b72for Te6edf3link Tff7b72in Te6edf3linksTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3dest Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffderegister_destinationTb4b4b4(Te6edf3destTb4b4b4)
Tff7b72def Td2a8ff_norm_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Te6edf3protoTff7b72.Td2a8ffnormalize_roomTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3rTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffreplaceTa5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffmax_room_name_bytesTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffroom name too longTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Tff7b72return Te6edf3r
Tff7b72def Td2a8ff_on_linkTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_sessionsTb4b4b4[Te6edf3linkTb4b4b4] Tff7b72= Te6edf3_SessionTb4b4b4(Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Tff7b72lambda Te6edf3dataTb4b4b4, Te6edf3pktTb4b4b4: Tff7b72selfTff7b72.Td2a8ff_on_packetTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_link_closed_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_on_closeTb4b4b4)
Te6edf3linkTff7b72.Td2a8ffset_remote_identified_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_on_remote_identifiedTb4b4b4)
Tff7b72def Td2a8ffconfigure_storageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_dirTb4b4b4, Te6edf3trustedTff7b72=Tff7b72NoneTb4b4b4, Te6edf3bannedTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Attach per-hub storage (hub.toml, rooms.toml) under hub_dir."""
Tff7b72selfTff7b72.Td2a8ff_hub_dir Tff7b72= Te6edf3hub_dir
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Te6edf3hub_dirTb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3policy_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3hub_dirTb4b4b4, Te6edf3HUB_CONFIG_FILENAMETb4b4b4)
Te6edf3rooms_path Tff7b72= Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Te6edf3hub_dirTb4b4b4, Te6edf3ROOMS_FILENAMETb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpolicy Tff7b72= Te6edf3HubPolicyTb4b4b4(Te6edf3policy_pathTb4b4b4)
Tff7b72if Te6edf3trusted Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffapply_configTb4b4b4(Te6edf3trusted_listTff7b72=Te6edf3trustedTb4b4b4)
Tff7b72if Te6edf3banned Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffapply_configTb4b4b4(Te6edf3banned_listTff7b72=Te6edf3bannedTb4b4b4)
Tff7b72if Te6edf3trusted Tff7b72is Tff7b72not Tff7b72None Tff7b72or Te6edf3banned Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffrooms Tff7b72= Te6edf3RoomRegistryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3RoomsTomlStoreTb4b4b4(Te6edf3rooms_pathTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ff_disconnect_bannedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3peer_hashTb4b4b4, Te6edf3outgoingTb4b4b4, Te6edf3messageTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3targets Tff7b72= Tb4b4b4[
Tb4b4b4(Te6edf3lnkTb4b4b4, Te6edf3sessTb4b4b4)
Tff7b72for Te6edf3lnkTb4b4b4, Te6edf3sess Tff7b72in Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)
Tff7b72and Tffa657bytesTb4b4b4(Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4) Tff7b72== Tffa657bytesTb4b4b4(Te6edf3peer_hashTb4b4b4)
Tb4b4b4]
Tff7b72for Te6edf3lnkTb4b4b4, Te6edf3sess Tff7b72in Te6edf3targetsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3lnkTb4b4b4, Te6edf3messageTb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3lnkTb4b4b4, Ta5d6ff"Ta5d6ffteardownTa5d6ff"Tb4b4b4)Tb4b4b4:
Te6edf3lnkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_on_remote_identifiedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3identityTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3identity Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3sess Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffgetTb4b4b4(Te6edf3linkTb4b4b4)
Tff7b72if Te6edf3sess Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72= Te6edf3identityTff7b72.Td2a8ffhash
Tff7b72if Te6edf3identity Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffis_bannedTb4b4b4(Te6edf3identityTff7b72.Td2a8ffhashTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_logTb4b4b4(
Ta5d6ff"Ta5d6ffDisconnecting banned peer Ta5d6ff" Tff7b72+ Te6edf3identityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4]Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_WARNINGTb4b4b4,
Tb4b4b4)
Te6edf3outgoing Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_disconnect_bannedTb4b4b4(Te6edf3identityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3outgoingTb4b4b4, Ta5d6ff"Ta5d6ffbannedTa5d6ff"Tb4b4b4)
Tff7b72for Te6edf3out_linkTb4b4b4, Te6edf3payload Tff7b72in Te6edf3outgoingTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_payloadTb4b4b4(Te6edf3out_linkTb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3linkTff7b72.Td2a8ffteardownTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_on_closeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Te6edf3parted Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3sess Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffpopTb4b4b4(Te6edf3linkTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3sess Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72for Te6edf3room Tff7b72in Tffa657listTb4b4b4(Te6edf3sessTff7b72.Td2a8ffroomsTb4b4b4)Tb4b4b4:
Te6edf3members Tff7b72= Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72if Te6edf3members Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72continue
Te6edf3membersTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3linkTb4b4b4)
Te6edf3remaining Tff7b72= Tffa657listTb4b4b4(Te6edf3membersTb4b4b4)
Te6edf3reg Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffget_stateTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72if Tff7b72not Te6edf3members Tff7b72and Tb4b4b4(Te6edf3reg Tff7b72is Tff7b72None Tff7b72or Tff7b72not Te6edf3regTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffpopTb4b4b4(Te6edf3roomTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3remaining Tff7b72and Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3partedTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3roomTb4b4b4, Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4, Te6edf3sessTff7b72.Td2a8ffnickTb4b4b4, Te6edf3remainingTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3roomTb4b4b4, Te6edf3peerTb4b4b4, Te6edf3nickTb4b4b4, Te6edf3remaining Tff7b72in Te6edf3partedTb4b4b4:
Te6edf3env Tff7b72= Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_PARTEDTb4b4b4,
Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3roomTff7b72=Te6edf3roomTb4b4b4,
Te6edf3bodyTff7b72=Tb4b4b4[Te6edf3peerTb4b4b4]Tb4b4b4,
Te6edf3nickTff7b72=Te6edf3nickTb4b4b4,
Tb4b4b4)
Te6edf3payload Tff7b72= Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3envTb4b4b4)
Tff7b72for Te6edf3member Tff7b72in Te6edf3remainingTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_payloadTb4b4b4(Te6edf3memberTb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ff_refill_and_takeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3costTff7b72=T79c0ff1.0Tb4b4b4)Tb4b4b4:
Te6edf3now Tff7b72= Te6edf3timeTff7b72.Td2a8ffmonotonicTb4b4b4(Tb4b4b4)
Te6edf3per_min Tff7b72= Tffa657floatTb4b4b4(Tffa657maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657intTb4b4b4(Tff7b72selfTff7b72.Td2a8ffrate_limit_msgs_per_minuteTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3elapsed Tff7b72= Tffa657maxTb4b4b4(T79c0ff0.0Tb4b4b4, Te6edf3now Tff7b72- Te6edf3sessTff7b72.Td2a8fflast_refillTb4b4b4)
Te6edf3sessTff7b72.Td2a8fftokens Tff7b72= Tffa657minTb4b4b4(Te6edf3per_minTb4b4b4, Te6edf3sessTff7b72.Td2a8fftokens Tff7b72+ Te6edf3elapsed Tff7b72* Tb4b4b4(Te6edf3per_min Tff7b72/ T79c0ff60.0Tb4b4b4)Tb4b4b4)
Te6edf3sessTff7b72.Td2a8fflast_refill Tff7b72= Te6edf3now
Tff7b72if Te6edf3sessTff7b72.Td2a8fftokens Tff7b72< Te6edf3costTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3sessTff7b72.Td2a8fftokens Tff7b72-Tff7b72= Te6edf3cost
Tff7b72return Tff7b72True
Tff7b72def Td2a8ff_send_payloadTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3_LoopbackEndpointTb4b4b4)Tb4b4b4:
Te6edf3linkTff7b72.Td2a8fffrom_serverTb4b4b4(Te6edf3payloadTb4b4b4)
Tff7b72return
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3payloadTb4b4b4)Tff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_attach_loopbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3client_identityTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3sess Tff7b72= Te6edf3_SessionTb4b4b4(Tb4b4b4)
Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72= Te6edf3client_identityTff7b72.Td2a8ffhash Tff7b72if Te6edf3client_identity Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72None
Tff7b72selfTff7b72.Td2a8ff_sessionsTb4b4b4[Te6edf3linkTb4b4b4] Tff7b72= Te6edf3sess
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ff_detach_loopbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_closeTb4b4b4(Te6edf3linkTb4b4b4)
Tff7b72def Td2a8ff_on_packetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3env Tff7b72= Te6edf3protoTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72return
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3envTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3sess Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffgetTb4b4b4(Te6edf3linkTb4b4b4)
Tff7b72if Te6edf3sess Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Tff7b72if Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3ri Tff7b72= Te6edf3linkTff7b72.Td2a8ffget_remote_identityTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3ri Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72= Te6edf3riTff7b72.Td2a8ffhash
Te6edf3outgoing Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_routeTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)
Tff7b72for Te6edf3out_linkTb4b4b4, Te6edf3payload Tff7b72in Te6edf3outgoingTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_payloadTb4b4b4(Te6edf3out_linkTb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72def Td2a8ff_routeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)Tb4b4b4:
Te6edf3t Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4)
Tff7b72if Te6edf3t Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_PONGTb4b4b4:
Tff7b72return
Tff7b72if Te6edf3t Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_PINGTb4b4b4:
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4(
Te6edf3linkTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_PONGTb4b4b4,
Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3bodyTff7b72=Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_BODYTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Tff7b72return
Tff7b72if Tff7b72not Te6edf3sessTff7b72.Td2a8ffwelcomedTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_helloTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)
Tff7b72return
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_refill_and_takeTb4b4b4(Te6edf3sessTb4b4b4)Tb4b4b4:
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4(
Te6edf3linkTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_ERRORTb4b4b4,
Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3bodyTff7b72=Ta5d6ff"Ta5d6ffrate limitedTa5d6ff"Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Tff7b72return
Tff7b72if Te6edf3t Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_HELLOTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_helloTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)
Tff7b72elif Te6edf3t Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_JOINTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_joinTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)
Tff7b72elif Te6edf3t Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_PARTTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_partTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)
Tff7b72elif Te6edf3t Tff7b72in Tb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_MSGTb4b4b4, Te6edf3protoTff7b72.Td2a8ffT_ACTIONTb4b4b4, Te6edf3protoTff7b72.Td2a8ffT_NOTICETb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_handle_messageTb4b4b4(Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)
Tff7b72def Td2a8ff_handle_helloTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)Tb4b4b4:
Te6edf3nick Tff7b72= Te6edf3protoTff7b72.Td2a8ffnormalize_nickTb4b4b4(Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_NICKTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffmax_nick_bytesTb4b4b4)
Tff7b72if Te6edf3nick Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3sessTff7b72.Td2a8ffnick Tff7b72= Te6edf3nick
Te6edf3sessTff7b72.Td2a8ffwelcomed Tff7b72= Tff7b72True
Te6edf3caps Tff7b72= Tb4b4b4{Te6edf3protoTff7b72.Td2a8ffCAP_ACTIONTb4b4b4: Tff7b72TrueTb4b4b4}
Te6edf3limits Tff7b72= Tb4b4b4{
Te6edf3protoTff7b72.Td2a8ffL_MAX_NICK_BYTESTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmax_nick_bytesTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffL_MAX_ROOM_NAME_BYTESTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmax_room_name_bytesTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffL_MAX_MSG_BODY_BYTESTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmax_msg_body_bytesTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffL_MAX_ROOMS_PER_SESSIONTb4b4b4: Tff7b72selfTff7b72.Td2a8ffmax_rooms_per_sessionTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffL_RATE_LIMIT_MSGS_PER_MINUTETb4b4b4: Tff7b72selfTff7b72.Td2a8ffrate_limit_msgs_per_minuteTb4b4b4,
Tb4b4b4}
Te6edf3body Tff7b72= Tb4b4b4{
Te6edf3protoTff7b72.Td2a8ffB_WELCOME_HUBTb4b4b4: Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffB_WELCOME_VERTb4b4b4: Te6edf3protoTff7b72.Td2a8ffHELLO_CLIENT_VERSIONTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffB_WELCOME_CAPSTb4b4b4: Te6edf3capsTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffB_WELCOME_LIMITSTb4b4b4: Te6edf3limitsTb4b4b4,
Tb4b4b4}
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4(
Te6edf3linkTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_WELCOMETb4b4b4, Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4, Te6edf3bodyTff7b72=Te6edf3body
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffgreetingTb4b4b4:
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4(
Te6edf3linkTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_NOTICETb4b4b4,
Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3bodyTff7b72=Tff7b72selfTff7b72.Td2a8ffgreetingTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Tff7b72def Td2a8ff_room_member_hashesTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3hashes Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3member Tff7b72in Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3roomTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3s Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffgetTb4b4b4(Te6edf3memberTb4b4b4)
Tff7b72if Te6edf3s Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657isinstanceTb4b4b4(Te6edf3sTff7b72.Td2a8ffpeerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3hashesTff7b72.Td2a8ffappendTb4b4b4(Tffa657bytesTb4b4b4(Te6edf3sTff7b72.Td2a8ffpeerTb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3hashes
Tff7b72def Td2a8ff_handle_joinTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)Tb4b4b4:
Te6edf3room Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_ROOMTb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72or Tff7b72not Te6edf3roomTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffJOIN requires room nameTa5d6ff"Tb4b4b4)
Tff7b72return
Tff7b72if Tffa657lenTb4b4b4(Te6edf3sessTff7b72.Td2a8ffroomsTb4b4b4) Tff7b72>Tff7b72= Tff7b72selfTff7b72.Td2a8ffmax_rooms_per_sessionTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6fftoo many roomsTa5d6ff"Tb4b4b4)
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_norm_roomTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72except Tf85149ValueError Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72return
Te6edf3peer Tff7b72= Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72else Tff7b72None
Te6edf3join_body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_BODYTb4b4b4)
Tff7b72if Te6edf3peer Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffis_room_bannedTb4b4b4(Te6edf3rTb4b4b4, Te6edf3peerTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffbanned from roomTa5d6ff"Tb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4)
Tff7b72return
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3rTb4b4b4, Te6edf3founderTff7b72=Te6edf3peerTb4b4b4)
Tff7b72if Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Tb4b4b4(
Te6edf3peer Tff7b72is Tff7b72not Tff7b72None
Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffis_room_opTb4b4b4(Te6edf3rTb4b4b4, Te6edf3peerTb4b4b4)
Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffis_invitedTb4b4b4(Te6edf3rTb4b4b4, Te6edf3peerTb4b4b4)
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffinvite-only (+i)Ta5d6ff"Tb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4)
Tff7b72return
Te6edf3key Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3keyTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3keyTb4b4b4:
Tff7b72if Tb4b4b4(
Te6edf3peer Tff7b72is Tff7b72not Tff7b72None
Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffis_room_opTb4b4b4(Te6edf3rTb4b4b4, Te6edf3peerTb4b4b4)
Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffis_invitedTb4b4b4(Te6edf3rTb4b4b4, Te6edf3peerTb4b4b4)
Tb4b4b4)Tb4b4b4:
Te6edf3provided Tff7b72= Te6edf3join_body Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3join_bodyTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3provided Tff7b72!= Te6edf3keyTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffbad key (+k)Ta5d6ff"Tb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4)
Tff7b72return
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3rTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3rTb4b4b4, Te6edf3founderTff7b72=Te6edf3peerTb4b4b4)
Te6edf3members Tff7b72= Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffsetdefaultTb4b4b4(Te6edf3rTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3existing Tff7b72= Tb4b4b4[Te6edf3m Tff7b72for Te6edf3m Tff7b72in Te6edf3members Tff7b72if Te6edf3m Tff7b72!= Te6edf3linkTb4b4b4]
Te6edf3membersTff7b72.Td2a8ffaddTb4b4b4(Te6edf3linkTb4b4b4)
Te6edf3sessTff7b72.Td2a8ffroomsTff7b72.Td2a8ffaddTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Te6edf3existingTb4b4b4:
Te6edf3fanout Tff7b72= Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_JOINEDTb4b4b4,
Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3roomTff7b72=Te6edf3rTb4b4b4,
Te6edf3bodyTff7b72=Tb4b4b4[Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4] Tff7b72if Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72NoneTb4b4b4,
Te6edf3nickTff7b72=Te6edf3sessTff7b72.Td2a8ffnickTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72for Te6edf3member Tff7b72in Te6edf3existingTb4b4b4:
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3memberTb4b4b4, Te6edf3fanoutTb4b4b4)Tb4b4b4)
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4(
Te6edf3linkTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_JOINEDTb4b4b4,
Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3roomTff7b72=Te6edf3rTb4b4b4,
Te6edf3bodyTff7b72=Tff7b72selfTff7b72.Td2a8ff_room_member_hashesTb4b4b4(Te6edf3rTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3rTb4b4b4)
Te6edf3topic Tff7b72= Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4)
Te6edf3reg_txt Tff7b72= Ta5d6ff"Ta5d6ffregisteredTa5d6ff" Tff7b72if Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4) Tff7b72else Ta5d6ff"Ta5d6ffunregisteredTa5d6ff"
Te6edf3modes Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffget_mode_stringTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_queue_noticeTb4b4b4(
Te6edf3outgoingTb4b4b4,
Te6edf3linkTb4b4b4,
Te6edf3rTb4b4b4,
Ta5d6ff"Ta5d6ffroom Ta5d6ff"
Tff7b72+ Te6edf3r
Tff7b72+ Ta5d6ff"Ta5d6ff: Ta5d6ff"
Tff7b72+ Te6edf3reg_txt
Tff7b72+ Ta5d6ff"Ta5d6ff; topic=Ta5d6ff"
Tff7b72+ Tb4b4b4(Te6edf3topic Tff7b72or Ta5d6ff"Ta5d6ff(none)Ta5d6ff"Tb4b4b4)
Tff7b72+ Ta5d6ff"Ta5d6ff; modes=Ta5d6ff"
Tff7b72+ Te6edf3modesTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8fftouch_roomTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ff_handle_partTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)Tb4b4b4:
Te6edf3room Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_ROOMTb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72or Tff7b72not Te6edf3roomTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffPART requires room nameTa5d6ff"Tb4b4b4)
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_norm_roomTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72except Tf85149ValueError Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72return
Te6edf3sessTff7b72.Td2a8ffroomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Te6edf3members Tff7b72= Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3rTb4b4b4)
Te6edf3remaining Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3members Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3membersTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3linkTb4b4b4)
Te6edf3remaining Tff7b72= Tffa657listTb4b4b4(Te6edf3membersTb4b4b4)
Te6edf3reg Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffget_stateTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Tff7b72not Te6edf3members Tff7b72and Tb4b4b4(Te6edf3reg Tff7b72is Tff7b72None Tff7b72or Tff7b72not Te6edf3regTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffpopTb4b4b4(Te6edf3rTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72if Te6edf3remaining Tff7b72and Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3fanout Tff7b72= Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_PARTEDTb4b4b4,
Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3roomTff7b72=Te6edf3rTb4b4b4,
Te6edf3bodyTff7b72=Tb4b4b4[Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4]Tb4b4b4,
Te6edf3nickTff7b72=Te6edf3sessTff7b72.Td2a8ffnickTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72for Te6edf3member Tff7b72in Te6edf3remainingTb4b4b4:
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3memberTb4b4b4, Te6edf3fanoutTb4b4b4)Tb4b4b4)
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4(
Te6edf3linkTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_PARTEDTb4b4b4,
Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3roomTff7b72=Te6edf3rTb4b4b4,
Te6edf3bodyTff7b72=Tb4b4b4[Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4] Tff7b72if Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72is Tff7b72not Tff7b72None Tff7b72else Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffmanagerTff7b72.Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4)
Tff7b72def Td2a8ff_handle_messageTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4, Te6edf3outgoingTb4b4b4)Tb4b4b4:
Te6edf3t Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4)
Te6edf3room Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_ROOMTb4b4b4)
Te6edf3body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_BODYTb4b4b4)
Tff7b72if Te6edf3t Tff7b72in Tb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_MSGTb4b4b4, Te6edf3protoTff7b72.Td2a8ffT_NOTICETb4b4b4) Tff7b72and Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3bodyTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_commandsTff7b72.Td2a8ffhandleTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3bodyTb4b4b4, Te6edf3outgoingTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffunrecognized commandTa5d6ff"Tb4b4b4, Te6edf3roomTff7b72=Te6edf3roomTb4b4b4)
Tff7b72return
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72or Tff7b72not Te6edf3roomTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffmessage requires room nameTa5d6ff"Tb4b4b4)
Tff7b72return
Tff7b72if Tb4b4b4(
Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657strTb4b4b4)
Tff7b72and Tffa657lenTb4b4b4(Te6edf3bodyTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffreplaceTa5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72> Tff7b72selfTff7b72.Td2a8ffmax_msg_body_bytes
Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffmessage too largeTa5d6ff"Tb4b4b4)
Tff7b72return
Tff7b72tryTb4b4b4:
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_norm_roomTb4b4b4(Te6edf3roomTb4b4b4)
Tff7b72except Tf85149ValueError Tff7b72as Te6edf3eTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72return
Te6edf3peer Tff7b72= Te6edf3sessTff7b72.Td2a8ffpeer Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3r Tff7b72not Tff7b72in Te6edf3sessTff7b72.Td2a8ffroomsTb4b4b4:
Te6edf3st_check Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffget_stateTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Te6edf3st_check Tff7b72is Tff7b72None Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3rTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffno such roomTa5d6ff"Tb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4)
Tff7b72return
Tff7b72if Te6edf3st_check Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657boolTb4b4b4(Te6edf3st_checkTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffno outside messages (+n)Ta5d6ff"Tb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4)
Tff7b72return
Tff7b72if Te6edf3peer Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffis_room_bannedTb4b4b4(Te6edf3rTb4b4b4, Te6edf3peerTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffbanned from roomTa5d6ff"Tb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4)
Tff7b72return
Tff7b72if Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffis_room_moderatedTb4b4b4(Te6edf3rTb4b4b4) Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffis_room_voicedTb4b4b4(Te6edf3rTb4b4b4, Te6edf3peerTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffroom is moderated (+m)Ta5d6ff"Tb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4)
Tff7b72return
Te6edf3members Tff7b72= Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Tff7b72not Te6edf3membersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Ta5d6ff"Ta5d6ffno such roomTa5d6ff"Tb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4)
Tff7b72return
Te6edf3envTb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_SRCTb4b4b4] Tff7b72= Tb4b4b4(
Tffa657bytesTb4b4b4(Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4) Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4) Tff7b72else Te6edf3sessTff7b72.Td2a8ffpeer
Tb4b4b4)
Te6edf3envTb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_ROOMTb4b4b4] Tff7b72= Te6edf3r
Te6edf3incoming_nick Tff7b72= Te6edf3protoTff7b72.Td2a8ffnormalize_nickTb4b4b4(Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_NICKTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffmax_nick_bytesTb4b4b4)
Tff7b72if Te6edf3incoming_nick Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3sessTff7b72.Td2a8ffnick Tff7b72= Te6edf3incoming_nick
Te6edf3envTb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_NICKTb4b4b4] Tff7b72= Te6edf3incoming_nick
Tff7b72elif Te6edf3sessTff7b72.Td2a8ffnickTb4b4b4:
Te6edf3envTb4b4b4[Te6edf3protoTff7b72.Td2a8ffK_NICKTb4b4b4] Tff7b72= Te6edf3sessTff7b72.Td2a8ffnick
Tff7b72elseTb4b4b4:
Te6edf3envTff7b72.Td2a8ffpopTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_NICKTb4b4b4, Tff7b72NoneTb4b4b4)
Te6edf3payload Tff7b72= Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(Te6edf3envTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_record_message_logTb4b4b4(Te6edf3rTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4)
Tff7b72for Te6edf3member Tff7b72in Tffa657listTb4b4b4(Te6edf3membersTb4b4b4)Tb4b4b4:
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(Tb4b4b4(Te6edf3memberTb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4)
Tff7b72def Td2a8ff_record_message_logTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3envTb4b4b4)Tb4b4b4:
Te6edf3t Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_TTb4b4b4)
Tff7b72if Te6edf3t Tff7b72not Tff7b72in Tb4b4b4(Te6edf3protoTff7b72.Td2a8ffT_MSGTb4b4b4, Te6edf3protoTff7b72.Td2a8ffT_ACTIONTb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3body Tff7b72= Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_BODYTb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3bodyTb4b4b4, Tffa657strTb4b4b4) Tff7b72or Tff7b72not Te6edf3bodyTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72if Te6edf3bodyTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ffstartswithTb4b4b4(Ta5d6ff"Ta5d6ff/Ta5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3peer Tff7b72= Te6edf3sessTff7b72.Td2a8ffpeer
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3peerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3nick Tff7b72= Te6edf3sessTff7b72.Td2a8ffnick Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sessTff7b72.Td2a8ffnickTb4b4b4, Tffa657strTb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Te6edf3nick Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3incoming Tff7b72= Te6edf3protoTff7b72.Td2a8ffnormalize_nickTb4b4b4(Te6edf3envTff7b72.Td2a8ffgetTb4b4b4(Te6edf3protoTff7b72.Td2a8ffK_NICKTb4b4b4)Tb4b4b4, Tff7b72selfTff7b72.Td2a8ffmax_nick_bytesTb4b4b4)
Tff7b72if Te6edf3incoming Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3nick Tff7b72= Te6edf3incoming
Te6edf3text Tff7b72= Te6edf3body
Tff7b72if Tffa657lenTb4b4b4(Te6edf3textTff7b72.Td2a8ffencodeTb4b4b4(Ta5d6ff"Ta5d6ffutf-8Ta5d6ff"Tb4b4b4, Te6edf3errorsTff7b72=Ta5d6ff"Ta5d6ffreplaceTa5d6ff"Tb4b4b4)Tb4b4b4) Tff7b72> T79c0ff500Tb4b4b4:
Te6edf3text Tff7b72= Te6edf3textTb4b4b4[Tb4b4b4:T79c0ff500Tb4b4b4] Tff7b72+ Ta5d6ff"Ta5d6ff...Ta5d6ff"
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_message_logTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6fftsTa5d6ff"Tb4b4b4: Te6edf3protoTff7b72.Td2a8ffnow_msTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffroomTa5d6ff"Tb4b4b4: Te6edf3roomTb4b4b4,
Ta5d6ff"Ta5d6ffpeerTa5d6ff"Tb4b4b4: Tffa657bytesTb4b4b4(Te6edf3peerTb4b4b4)Tff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffnickTa5d6ff"Tb4b4b4: Te6edf3nickTb4b4b4,
Ta5d6ff"Ta5d6ffkindTa5d6ff"Tb4b4b4: Ta5d6ff"Ta5d6ffactionTa5d6ff" Tff7b72if Te6edf3t Tff7b72== Te6edf3protoTff7b72.Td2a8ffT_ACTION Tff7b72else Ta5d6ff"Ta5d6ffmsgTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6fftextTa5d6ff"Tb4b4b4: Te6edf3textTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tff7b72def Td2a8ff_flush_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3outgoingTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3out_linkTb4b4b4, Te6edf3payload Tff7b72in Te6edf3outgoingTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_send_payloadTb4b4b4(Te6edf3out_linkTb4b4b4, Te6edf3payloadTb4b4b4)
Tff7b72def Td2a8ff_queue_noticeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3roomTb4b4b4, Te6edf3textTb4b4b4)Tb4b4b4:
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4(
Te6edf3linkTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_NOTICETb4b4b4,
Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3roomTff7b72=Te6edf3roomTb4b4b4,
Te6edf3bodyTff7b72=Te6edf3textTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Tff7b72def Td2a8ff_queue_errorTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3outgoingTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3textTb4b4b4, Te6edf3roomTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Te6edf3outgoingTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4(
Te6edf3linkTb4b4b4,
Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffmake_envelopeTb4b4b4(
Te6edf3protoTff7b72.Td2a8ffT_ERRORTb4b4b4,
Te6edf3srcTff7b72=Tff7b72selfTff7b72.Td2a8ffidentityTff7b72.Td2a8ffhashTb4b4b4,
Te6edf3roomTff7b72=Te6edf3roomTb4b4b4,
Te6edf3bodyTff7b72=Te6edf3textTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4)
Tff7b72def Td2a8ffregister_roomTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3nameTb4b4b4,
Te6edf3topicTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3privateTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3moderatedTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3invite_onlyTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3topic_ops_onlyTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3no_outside_msgsTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3keyTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3founderTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_norm_roomTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffregister_roomTb4b4b4(
Te6edf3rTb4b4b4,
Te6edf3topicTff7b72=Te6edf3topicTb4b4b4,
Te6edf3privateTff7b72=Te6edf3privateTb4b4b4,
Te6edf3moderatedTff7b72=Te6edf3moderatedTb4b4b4,
Te6edf3invite_onlyTff7b72=Te6edf3invite_onlyTb4b4b4,
Te6edf3topic_ops_onlyTff7b72=Te6edf3topic_ops_onlyTb4b4b4,
Te6edf3no_outside_msgsTff7b72=Te6edf3no_outside_msgsTb4b4b4,
Te6edf3keyTff7b72=Te6edf3keyTb4b4b4,
Te6edf3founderTff7b72=Te6edf3founderTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffsetdefaultTb4b4b4(Te6edf3rTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3r
Tff7b72def Td2a8ffunregister_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Te6edf3protoTff7b72.Td2a8ffnormalize_roomTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffunregister_roomTb4b4b4(Te6edf3rTb4b4b4)
Te6edf3members Tff7b72= Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Te6edf3members Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tff7b72not Te6edf3membersTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffpopTb4b4b4(Te6edf3rTb4b4b4, Tff7b72NoneTb4b4b4)
Tff7b72return Te6edf3r
Tff7b72def Td2a8ffset_room_topicTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTb4b4b4, Te6edf3topicTb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Te6edf3protoTff7b72.Td2a8ffnormalize_roomTb4b4b4(Te6edf3nameTb4b4b4)
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3rTb4b4b4)
Te6edf3stTb4b4b4[Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3topic Tff7b72or Tff7b72None
Tff7b72if Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffregisteredTa5d6ff"Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffpersistTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72def Td2a8ffclient_countTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72return Tffa657sumTb4b4b4(T79c0ff1 Tff7b72for Te6edf3s Tff7b72in Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3sTff7b72.Td2a8ffwelcomedTb4b4b4)
Tff7b72def Td2a8ffmembers_dictTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3roomTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e"""Return connected clients, optionally filtered to a single room."""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3out Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72if Te6edf3room Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_norm_roomTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3links Tff7b72= Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3rTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3seen Tff7b72= Tffa657setTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3link Tff7b72in Te6edf3linksTb4b4b4:
Te6edf3sess Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffgetTb4b4b4(Te6edf3linkTb4b4b4)
Tff7b72if Te6edf3sess Tff7b72is Tff7b72None Tff7b72or Tff7b72not Te6edf3sessTff7b72.Td2a8ffwelcomedTb4b4b4:
Tff7b72continue
Te6edf3peer Tff7b72= Te6edf3sessTff7b72.Td2a8ffpeer
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3peerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3ph Tff7b72= Tffa657bytesTb4b4b4(Te6edf3peerTb4b4b4)
Tff7b72if Te6edf3ph Tff7b72in Te6edf3seenTb4b4b4:
Tff7b72continue
Te6edf3seenTff7b72.Td2a8ffaddTb4b4b4(Te6edf3phTb4b4b4)
Te6edf3outTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_member_entryTb4b4b4(Te6edf3sessTb4b4b4, Te6edf3phTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72for Te6edf3sess Tff7b72in Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Te6edf3sessTff7b72.Td2a8ffwelcomedTb4b4b4:
Tff7b72continue
Te6edf3peer Tff7b72= Te6edf3sessTff7b72.Td2a8ffpeer
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3peerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72continue
Te6edf3outTff7b72.Td2a8ffappendTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_member_entryTb4b4b4(Te6edf3sessTb4b4b4, Tffa657bytesTb4b4b4(Te6edf3peerTb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3outTff7b72.Td2a8ffsortTb4b4b4(Te6edf3keyTff7b72=Tff7b72lambda Te6edf3mTb4b4b4: Te6edf3mTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tff7b72.Td2a8fflowerTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3out
Tff7b72def Td2a8ff_member_entryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sessTb4b4b4, Te6edf3peer_hashTb4b4b4)Tb4b4b4:
Te6edf3nick Tff7b72= Te6edf3sessTff7b72.Td2a8ffnick Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3sessTff7b72.Td2a8ffnickTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3sessTff7b72.Td2a8ffnick Tff7b72else Tff7b72None
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4: Te6edf3peer_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nick Tff7b72or Te6edf3peer_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4[Tb4b4b4:T79c0ff12Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffnickTa5d6ff"Tb4b4b4: Te6edf3nickTb4b4b4,
Ta5d6ff"Ta5d6ffroomsTa5d6ff"Tb4b4b4: Tffa657sortedTb4b4b4(Te6edf3sessTff7b72.Td2a8ffroomsTb4b4b4)Tb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffrooms_activityTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3rooms_cfg Tff7b72= Tb4b4b4{Tb4b4b4}
Te6edf3names Tff7b72= Tffa657setTb4b4b4(Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ff_registryTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72| Tffa657setTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3name Tff7b72in Te6edf3namesTb4b4b4:
Te6edf3cfg Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffroom_config_for_apiTb4b4b4(Te6edf3nameTb4b4b4)
Te6edf3cfgTb4b4b4[Ta5d6ff"Ta5d6ffmembersTa5d6ff"Tb4b4b4] Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3nameTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3cfgTb4b4b4[Ta5d6ff"Ta5d6ffmessage_countTa5d6ff"Tb4b4b4] Tff7b72= T79c0ff0
Te6edf3cfgTb4b4b4[Ta5d6ff"Ta5d6fflast_activity_tsTa5d6ff"Tb4b4b4] Tff7b72= Tff7b72None
Te6edf3rooms_cfgTb4b4b4[Te6edf3nameTb4b4b4] Tff7b72= Te6edf3cfg
Te6edf3recent Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3entry Tff7b72in Tffa657reversedTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_message_logTb4b4b4)Tb4b4b4:
Te6edf3r Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffroomTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3r Tff7b72in Te6edf3rooms_cfgTb4b4b4:
Te6edf3rooms_cfgTb4b4b4[Te6edf3rTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6ffmessage_countTa5d6ff"Tb4b4b4] Tff7b72+Tff7b72= T79c0ff1
Te6edf3ts Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftsTa5d6ff"Tb4b4b4)
Tff7b72if Te6edf3ts Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tb4b4b4(
Te6edf3rooms_cfgTb4b4b4[Te6edf3rTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fflast_activity_tsTa5d6ff"Tb4b4b4] Tff7b72is Tff7b72None
Tff7b72or Te6edf3ts Tff7b72> Te6edf3rooms_cfgTb4b4b4[Te6edf3rTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fflast_activity_tsTa5d6ff"Tb4b4b4]
Tb4b4b4)Tb4b4b4:
Te6edf3rooms_cfgTb4b4b4[Te6edf3rTb4b4b4]Tb4b4b4[Ta5d6ff"Ta5d6fflast_activity_tsTa5d6ff"Tb4b4b4] Tff7b72= Te6edf3ts
Tff7b72if Tffa657lenTb4b4b4(Te6edf3recentTb4b4b4) Tff7b72< T79c0ff80Tb4b4b4:
Te6edf3recentTff7b72.Td2a8ffappendTb4b4b4(Tffa657dictTb4b4b4(Te6edf3entryTb4b4b4)Tb4b4b4)
Te6edf3rooms Tff7b72= Tb4b4b4[Te6edf3rooms_cfgTb4b4b4[Te6edf3nTb4b4b4] Tff7b72for Te6edf3n Tff7b72in Tffa657sortedTb4b4b4(Te6edf3rooms_cfgTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4]
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffroomsTa5d6ff"Tb4b4b4: Te6edf3roomsTb4b4b4, Ta5d6ff"Ta5d6ffrecentTa5d6ff"Tb4b4b4: Tffa657listTb4b4b4(Tffa657reversedTb4b4b4(Te6edf3recentTb4b4b4)Tb4b4b4)Tb4b4b4}
Tff7b72def Td2a8ffmessages_for_peerTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3peer_hexTb4b4b4, Te6edf3roomTff7b72=Tff7b72NoneTb4b4b4, Te6edf3limitTff7b72=T79c0ff200Tb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3parse_identity_hashTb4b4b4(Te6edf3peer_hexTb4b4b4)
Tff7b72if Te6edf3peer Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffinvalid peer hashTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3ph Tff7b72= Te6edf3peerTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)
Te6edf3limit Tff7b72= Tffa657maxTb4b4b4(T79c0ff1Tb4b4b4, Tffa657minTb4b4b4(Tffa657intTb4b4b4(Te6edf3limitTb4b4b4) Tff7b72if Te6edf3limit Tff7b72is Tff7b72not Tff7b72None Tff7b72else T79c0ff200Tb4b4b4, T79c0ff500Tb4b4b4)Tb4b4b4)
Te6edf3room_n Tff7b72= Tff7b72None
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657strTb4b4b4) Tff7b72and Te6edf3roomTff7b72.Td2a8ffstripTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3room_n Tff7b72= Tff7b72selfTff7b72.Td2a8ff_norm_roomTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3out Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72for Te6edf3entry Tff7b72in Tffa657reversedTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_message_logTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffpeerTa5d6ff"Tb4b4b4) Tff7b72!= Te6edf3phTb4b4b4:
Tff7b72continue
Tff7b72if Te6edf3room_n Tff7b72is Tff7b72not Tff7b72None Tff7b72and Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffroomTa5d6ff"Tb4b4b4) Tff7b72!= Te6edf3room_nTb4b4b4:
Tff7b72continue
Te6edf3outTff7b72.Td2a8ffappendTb4b4b4(Tffa657dictTb4b4b4(Te6edf3entryTb4b4b4)Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3outTb4b4b4) Tff7b72>Tff7b72= Te6edf3limitTb4b4b4:
Tff7b72break
Te6edf3outTff7b72.Td2a8ffreverseTb4b4b4(Tb4b4b4)
Tff7b72return Te6edf3out
Tff7b72def Td2a8ffadmin_kick_from_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3peer_hexTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3parse_identity_hashTb4b4b4(Te6edf3peer_hexTb4b4b4)
Tff7b72if Te6edf3peer Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffinvalid peer hashTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_norm_roomTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3outgoing Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3target_link Tff7b72= Tff7b72None
Tff7b72for Te6edf3linkTb4b4b4, Te6edf3sess Tff7b72in Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffitemsTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72if Tb4b4b4(
Tffa657isinstanceTb4b4b4(Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)
Tff7b72and Tffa657bytesTb4b4b4(Te6edf3sessTff7b72.Td2a8ffpeerTb4b4b4) Tff7b72== Te6edf3peer
Tff7b72and Te6edf3r Tff7b72in Te6edf3sessTff7b72.Td2a8ffrooms
Tb4b4b4)Tb4b4b4:
Te6edf3target_link Tff7b72= Te6edf3link
Tff7b72break
Tff7b72if Te6edf3target_link Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffpeer not in roomTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3tsess Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sessionsTb4b4b4[Te6edf3target_linkTb4b4b4]
Te6edf3tsessTff7b72.Td2a8ffroomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Te6edf3members Tff7b72= Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72if Te6edf3members Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3membersTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3target_linkTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(Te6edf3outgoingTb4b4b4, Te6edf3target_linkTb4b4b4, Ta5d6ff"Ta5d6ffkicked from Ta5d6ff" Tff7b72+ Te6edf3rTb4b4b4, Te6edf3roomTff7b72=Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_flush_outgoingTb4b4b4(Te6edf3outgoingTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffadmin_hub_banTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3peer_hexTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3parse_identity_hashTb4b4b4(Te6edf3peer_hexTb4b4b4)
Tff7b72if Te6edf3peer Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffinvalid peer hashTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3outgoing Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffadd_banTb4b4b4(Te6edf3peerTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_disconnect_bannedTb4b4b4(Te6edf3peerTb4b4b4, Te6edf3outgoingTb4b4b4, Ta5d6ff"Ta5d6ffbanned (kline)Ta5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_flush_outgoingTb4b4b4(Te6edf3outgoingTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffadmin_room_banTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3peer_hexTb4b4b4, Te6edf3roomTb4b4b4)Tb4b4b4:
Te6edf3peer Tff7b72= Te6edf3parse_identity_hashTb4b4b4(Te6edf3peer_hexTb4b4b4)
Tff7b72if Te6edf3peer Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6ff"Ta5d6ffinvalid peer hashTa5d6ff"
Tff7b72raise Tf85149ValueErrorTb4b4b4(Te6edf3msgTb4b4b4)
Te6edf3r Tff7b72= Tff7b72selfTff7b72.Td2a8ff_norm_roomTb4b4b4(Te6edf3roomTb4b4b4)
Te6edf3outgoing Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffensure_stateTb4b4b4(Te6edf3rTb4b4b4)
Te6edf3bans Tff7b72= Te6edf3stTff7b72.Td2a8ffsetdefaultTb4b4b4(Ta5d6ff"Ta5d6ffbansTa5d6ff"Tb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3bansTff7b72.Td2a8ffaddTb4b4b4(Te6edf3peerTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8fftouch_roomTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffpersistTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72for Te6edf3member Tff7b72in Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3rTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3ms Tff7b72= Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffgetTb4b4b4(Te6edf3memberTb4b4b4)
Tff7b72if Te6edf3ms Tff7b72is Tff7b72not Tff7b72None Tff7b72and Tffa657isinstanceTb4b4b4(Te6edf3msTff7b72.Td2a8ffpeerTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657bytesTb4b4b4(Te6edf3msTff7b72.Td2a8ffpeerTb4b4b4) Tff7b72== Te6edf3peerTb4b4b4:
Te6edf3msTff7b72.Td2a8ffroomsTff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3rTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_room_membersTb4b4b4[Te6edf3rTb4b4b4]Tff7b72.Td2a8ffdiscardTb4b4b4(Te6edf3memberTb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_queue_errorTb4b4b4(
Te6edf3outgoingTb4b4b4,
Te6edf3memberTb4b4b4,
Ta5d6ff"Ta5d6ffbanned from Ta5d6ff" Tff7b72+ Te6edf3rTb4b4b4,
Te6edf3roomTff7b72=Te6edf3rTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_flush_outgoingTb4b4b4(Te6edf3outgoingTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffto_dictTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Return a JSON-serializable summary of this hub."""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3rooms Tff7b72= Tb4b4b4[Tb4b4b4]
Te6edf3names Tff7b72= Tffa657setTb4b4b4(Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ff_registryTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72| Tffa657setTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3name Tff7b72in Tffa657sortedTb4b4b4(Te6edf3namesTb4b4b4)Tb4b4b4:
Te6edf3cfg Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ffroom_config_for_apiTb4b4b4(Te6edf3nameTb4b4b4)
Te6edf3cfgTb4b4b4[Ta5d6ff"Ta5d6ffmembersTa5d6ff"Tb4b4b4] Tff7b72= Tffa657lenTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_room_membersTff7b72.Td2a8ffgetTb4b4b4(Te6edf3nameTb4b4b4, Tffa657setTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3roomsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3cfgTb4b4b4)
Te6edf3policy Tff7b72= Tff7b72selfTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffto_dictTb4b4b4(Tb4b4b4)
Te6edf3uptime_seconds Tff7b72= T79c0ff0
Tff7b72if Tff7b72selfTff7b72.Td2a8ffrunning Tff7b72and Tff7b72selfTff7b72.Td2a8ff_started_at Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3uptime_seconds Tff7b72= Tffa657maxTb4b4b4(T79c0ff0Tb4b4b4, Tffa657intTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Tff7b72selfTff7b72.Td2a8ff_started_atTb4b4b4)Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhub_idTb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4,
Ta5d6ff"Ta5d6ffdest_hashTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffdest_hashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4) Tff7b72if Tff7b72selfTff7b72.Td2a8ffdest_hash Tff7b72else Tff7b72NoneTb4b4b4,
Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffenabledTb4b4b4,
Ta5d6ff"Ta5d6ffrunningTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffrunningTb4b4b4,
Ta5d6ff"Ta5d6ffuptime_secondsTa5d6ff"Tb4b4b4: Te6edf3uptime_secondsTb4b4b4,
Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffannounceTb4b4b4,
Ta5d6ff"Ta5d6ffgreetingTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffgreetingTb4b4b4,
Ta5d6ff"Ta5d6ffclientsTa5d6ff"Tb4b4b4: Tffa657sumTb4b4b4(T79c0ff1 Tff7b72for Te6edf3s Tff7b72in Tff7b72selfTff7b72.Td2a8ff_sessionsTff7b72.Td2a8ffvaluesTb4b4b4(Tb4b4b4) Tff7b72if Te6edf3sTff7b72.Td2a8ffwelcomedTb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftrusted_identitiesTa5d6ff"Tb4b4b4: Te6edf3policyTb4b4b4[Ta5d6ff"Ta5d6fftrusted_identitiesTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffbanned_identitiesTa5d6ff"Tb4b4b4: Te6edf3policyTb4b4b4[Ta5d6ff"Ta5d6ffbanned_identitiesTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffroomsTa5d6ff"Tb4b4b4: Te6edf3roomsTb4b4b4,
Tb4b4b4}
Tff7b72def Td2a8ffconfig_entryTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3rooms Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72for Te6edf3name Tff7b72in Tffa657sortedTb4b4b4(Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ff_registryTff7b72.Td2a8ffkeysTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4:
Te6edf3st Tff7b72= Tff7b72selfTff7b72.Td2a8ffroomsTff7b72.Td2a8ff_registryTb4b4b4[Te6edf3nameTb4b4b4]
Te6edf3roomsTff7b72.Td2a8ffappendTb4b4b4(
Tb4b4b4{
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Te6edf3nameTb4b4b4,
Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4: Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4: Tffa657boolTb4b4b4(Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4: Te6edf3stTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4}
Tb4b4b4)
Te6edf3policy Tff7b72= Tff7b72selfTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffto_dictTb4b4b4(Tb4b4b4)
Tff7b72return Tb4b4b4{
Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffhub_idTb4b4b4,
Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffnameTb4b4b4,
Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffenabledTb4b4b4,
Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffannounceTb4b4b4,
Ta5d6ff"Ta5d6ffgreetingTa5d6ff"Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffgreetingTb4b4b4,
Ta5d6ff"Ta5d6fftrusted_identitiesTa5d6ff"Tb4b4b4: Te6edf3policyTb4b4b4[Ta5d6ff"Ta5d6fftrusted_identitiesTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffbanned_identitiesTa5d6ff"Tb4b4b4: Te6edf3policyTb4b4b4[Ta5d6ff"Ta5d6ffbanned_identitiesTa5d6ff"Tb4b4b4]Tb4b4b4,
Ta5d6ff"Ta5d6ffroomsTa5d6ff"Tb4b4b4: Te6edf3roomsTb4b4b4,
Tb4b4b4}
Tff7b72class T56d364RRCServerManagerTb4b4b4:
T8b949e"""Hosts and persists multiple RRC hubs for a single node."""
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3storage_dirTb4b4b4, Te6edf3on_changeTff7b72=Tff7b72NoneTb4b4b4, Te6edf3owner_identityTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffstorage_dir Tff7b72= Te6edf3storage_dir
Tff7b72selfTff7b72.Td2a8ff_on_change Tff7b72= Te6edf3on_change
Tff7b72selfTff7b72.Td2a8ffowner_identity Tff7b72= Tb4b4b4(
Tffa657bytesTb4b4b4(Te6edf3owner_identityTb4b4b4)
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3owner_identityTb4b4b4, Tb4b4b4(Tffa657bytesTb4b4b4, Tffa657bytearrayTb4b4b4)Tb4b4b4)
Tff7b72else Tff7b72None
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffhubs Tff7b72= Tb4b4b4[Tb4b4b4]
Tff7b72selfTff7b72.Td2a8ff_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffRLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_loaded Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff_save_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ff_owner_trusted_hex_listTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffowner_identity Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72None
Tff7b72return Tb4b4b4[Tffa657bytesTb4b4b4(Tff7b72selfTff7b72.Td2a8ffowner_identityTb4b4b4)Tff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4]
Tff7b72def Td2a8ffset_change_callbackTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3cbTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_change Tff7b72= Te6edf3cb
Tff7b72def Td2a8ff_notify_changeTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hubTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_on_change Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_on_changeTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72def Td2a8ff_server_dirTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ffstorage_dirTb4b4b4, Te6edf3SERVER_DIR_NAMETb4b4b4)
Tff7b72def Td2a8ff_store_pathTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_server_dirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3STORE_FILENAMETb4b4b4)
Tff7b72def Td2a8ff_identity_pathTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_idTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_server_dirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3hub_id Tff7b72+ Ta5d6ff"Ta5d6ff.identityTa5d6ff"Tb4b4b4)
Tff7b72def Td2a8ff_hub_dirTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_idTb4b4b4)Tb4b4b4:
Tff7b72return Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffjoinTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_server_dirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3hub_idTb4b4b4)
Tff7b72def Td2a8fffind_hubTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_idTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72for Te6edf3hub Tff7b72in Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4:
Tff7b72if Te6edf3hubTff7b72.Td2a8ffhub_id Tff7b72== Te6edf3hub_idTb4b4b4:
Tff7b72return Te6edf3hub
Tff7b72return Tff7b72None
Tff7b72def Td2a8ffcreate_hubTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3nameTff7b72=Tff7b72NoneTb4b4b4, Te6edf3greetingTff7b72=Tff7b72NoneTb4b4b4, Te6edf3announceTff7b72=Tff7b72TrueTb4b4b4, Te6edf3enabledTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTb4b4b4(Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_server_dirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Te6edf3identityTff7b72.Td2a8ffto_fileTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_identity_pathTb4b4b4(Te6edf3identityTff7b72.Td2a8ffhashTff7b72.Td2a8ffhexTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3hub Tff7b72= Te6edf3RRCHubServerTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3identityTb4b4b4,
Te6edf3nameTff7b72=Te6edf3nameTb4b4b4,
Te6edf3greetingTff7b72=Te6edf3greetingTb4b4b4,
Te6edf3announceTff7b72=Te6edf3announceTb4b4b4,
Te6edf3enabledTff7b72=Te6edf3enabledTb4b4b4,
Tb4b4b4)
Te6edf3trusted Tff7b72= Tff7b72selfTff7b72.Td2a8ff_owner_trusted_hex_listTb4b4b4(Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffconfigure_storageTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_hub_dirTb4b4b4(Te6edf3hubTff7b72.Td2a8ffhub_idTb4b4b4)Tb4b4b4,
Te6edf3trustedTff7b72=Te6edf3trustedTb4b4b4,
Te6edf3bannedTff7b72=Tb4b4b4[Tb4b4b4]Tb4b4b4,
Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhubsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72if Te6edf3enabledTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_notify_changeTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72return Te6edf3hub
Tff7b72def Td2a8ffdelete_hubTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_idTb4b4b4)Tb4b4b4:
Te6edf3hub Tff7b72= Tff7b72selfTff7b72.Td2a8fffind_hubTb4b4b4(Te6edf3hub_idTb4b4b4)
Tff7b72if Te6edf3hub Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72if Te6edf3hub Tff7b72in Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhubsTff7b72.Td2a8ffremoveTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ff_identity_pathTb4b4b4(Te6edf3hub_idTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Tff7b72import T7ee787shutil
Te6edf3hub_dir Tff7b72= Tff7b72selfTff7b72.Td2a8ff_hub_dirTb4b4b4(Te6edf3hub_idTb4b4b4)
Tff7b72if Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisdirTb4b4b4(Te6edf3hub_dirTb4b4b4)Tb4b4b4:
Te6edf3shutilTff7b72.Td2a8ffrmtreeTb4b4b4(Te6edf3hub_dirTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_notify_changeTb4b4b4(Tb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffstart_hubTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_idTb4b4b4)Tb4b4b4:
Te6edf3hub Tff7b72= Tff7b72selfTff7b72.Td2a8fffind_hubTb4b4b4(Te6edf3hub_idTb4b4b4)
Tff7b72if Te6edf3hub Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3hubTff7b72.Td2a8ffenabled Tff7b72= Tff7b72True
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_notify_changeTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffstop_hubTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_idTb4b4b4)Tb4b4b4:
Te6edf3hub Tff7b72= Tff7b72selfTff7b72.Td2a8fffind_hubTb4b4b4(Te6edf3hub_idTb4b4b4)
Tff7b72if Te6edf3hub Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3hubTff7b72.Td2a8ffenabled Tff7b72= Tff7b72False
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_notify_changeTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffupdate_hubTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3hub_idTb4b4b4,
Te6edf3nameTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3greetingTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3announceTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3trusted_identitiesTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3banned_identitiesTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3hub Tff7b72= Tff7b72selfTff7b72.Td2a8fffind_hubTb4b4b4(Te6edf3hub_idTb4b4b4)
Tff7b72if Te6edf3hub Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Tff7b72if Te6edf3name Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3hubTff7b72.Td2a8ffname Tff7b72= Te6edf3name
Tff7b72if Te6edf3greeting Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3hubTff7b72.Td2a8ffgreeting Tff7b72= Te6edf3greeting Tff7b72or Tff7b72None
Tff7b72if Te6edf3announce Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3hubTff7b72.Td2a8ffannounce Tff7b72= Tffa657boolTb4b4b4(Te6edf3announceTb4b4b4)
Tff7b72if Te6edf3trusted_identities Tff7b72is Tff7b72not Tff7b72None Tff7b72or Te6edf3banned_identities Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Te6edf3hubTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffapply_configTb4b4b4(
Te6edf3trusted_listTff7b72=Te6edf3trusted_identitiesTb4b4b4,
Te6edf3banned_listTff7b72=Te6edf3banned_identitiesTb4b4b4,
Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffpolicyTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_notify_changeTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffcreate_roomTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3hub_idTb4b4b4,
Te6edf3nameTb4b4b4,
Te6edf3topicTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3privateTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3moderatedTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3invite_onlyTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3topic_ops_onlyTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3no_outside_msgsTff7b72=Tff7b72FalseTb4b4b4,
Te6edf3keyTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)Tb4b4b4:
Te6edf3hub Tff7b72= Tff7b72selfTff7b72.Td2a8fffind_hubTb4b4b4(Te6edf3hub_idTb4b4b4)
Tff7b72if Te6edf3hub Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3hubTff7b72.Td2a8ffregister_roomTb4b4b4(
Te6edf3nameTb4b4b4,
Te6edf3topicTff7b72=Te6edf3topicTb4b4b4,
Te6edf3privateTff7b72=Te6edf3privateTb4b4b4,
Te6edf3moderatedTff7b72=Te6edf3moderatedTb4b4b4,
Te6edf3invite_onlyTff7b72=Te6edf3invite_onlyTb4b4b4,
Te6edf3topic_ops_onlyTff7b72=Te6edf3topic_ops_onlyTb4b4b4,
Te6edf3no_outside_msgsTff7b72=Te6edf3no_outside_msgsTb4b4b4,
Te6edf3keyTff7b72=Te6edf3keyTb4b4b4,
Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_notify_changeTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffdelete_roomTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3hub_idTb4b4b4, Te6edf3nameTb4b4b4)Tb4b4b4:
Te6edf3hub Tff7b72= Tff7b72selfTff7b72.Td2a8fffind_hubTb4b4b4(Te6edf3hub_idTb4b4b4)
Tff7b72if Te6edf3hub Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return Tff7b72False
Te6edf3hubTff7b72.Td2a8ffunregister_roomTb4b4b4(Te6edf3nameTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffsaveTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ff_notify_changeTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72return Tff7b72True
Tff7b72def Td2a8ffloadTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ff_loadedTb4b4b4:
Tff7b72return
Tff7b72selfTff7b72.Td2a8ff_loaded Tff7b72= Tff7b72True
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ff_store_pathTb4b4b4(Tb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72tryTb4b4b4:
Tff7b72with Tffa657openTb4b4b4(Te6edf3pathTb4b4b4, Ta5d6ff"Ta5d6ffrbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3obj Tff7b72= Te6edf3protoTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3fTff7b72.Td2a8ffreadTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffFailed to load RRC hub servers: Ta5d6ff" Tff7b72+ Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3objTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return
Tff7b72for Te6edf3entry Tff7b72in Te6edf3objTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffhubsTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ff_load_entryTb4b4b4(Te6edf3entryTb4b4b4)
Tff7b72def Td2a8ff_load_entryTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3entryTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3entryTb4b4b4, Tffa657dictTb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3hub_id Tff7b72= Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffidTa5d6ff"Tb4b4b4)
Tff7b72if Tff7b72not Tffa657isinstanceTb4b4b4(Te6edf3hub_idTb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3ident_path Tff7b72= Tff7b72selfTff7b72.Td2a8ff_identity_pathTb4b4b4(Te6edf3hub_idTb4b4b4)
Tff7b72if Tff7b72not Te6edf3osTff7b72.Td2a8ffpathTff7b72.Td2a8ffisfileTb4b4b4(Te6edf3ident_pathTb4b4b4)Tb4b4b4:
Tff7b72return
Te6edf3identity Tff7b72= Te6edf3RNSTff7b72.Td2a8ffIdentityTff7b72.Td2a8fffrom_fileTb4b4b4(Te6edf3ident_pathTb4b4b4)
Tff7b72if Te6edf3identity Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72return
Te6edf3hub Tff7b72= Te6edf3RRCHubServerTb4b4b4(
Tff7b72selfTb4b4b4,
Te6edf3identityTb4b4b4,
Te6edf3nameTff7b72=Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3greetingTff7b72=Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffgreetingTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3announceTff7b72=Tffa657boolTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffannounceTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3enabledTff7b72=Tffa657boolTb4b4b4(Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffenabledTa5d6ff"Tb4b4b4, Tff7b72TrueTb4b4b4)Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Te6edf3hubTff7b72.Td2a8ffconfigure_storageTb4b4b4(
Tff7b72selfTff7b72.Td2a8ff_hub_dirTb4b4b4(Te6edf3hub_idTb4b4b4)Tb4b4b4,
Te6edf3trustedTff7b72=Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftrusted_identitiesTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3bannedTff7b72=Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffbanned_identitiesTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72for Te6edf3room Tff7b72in Te6edf3entryTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffroomsTa5d6ff"Tb4b4b4, Tb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4:
Tff7b72if Tffa657isinstanceTb4b4b4(Te6edf3roomTb4b4b4, Tffa657dictTb4b4b4) Tff7b72and Tffa657isinstanceTb4b4b4(Te6edf3roomTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4)Tb4b4b4, Tffa657strTb4b4b4)Tb4b4b4:
Te6edf3rname Tff7b72= Te6edf3protoTff7b72.Td2a8ffnormalize_roomTb4b4b4(Te6edf3roomTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3rname Tff7b72in Te6edf3hubTff7b72.Td2a8ffroomsTff7b72.Td2a8ff_registryTb4b4b4:
Tff7b72continue
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffregister_roomTb4b4b4(
Te6edf3roomTb4b4b4[Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4]Tb4b4b4,
Te6edf3topicTff7b72=Te6edf3roomTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftopicTa5d6ff"Tb4b4b4)Tb4b4b4,
Te6edf3privateTff7b72=Tffa657boolTb4b4b4(Te6edf3roomTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffprivateTa5d6ff"Tb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3moderatedTff7b72=Tffa657boolTb4b4b4(Te6edf3roomTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffmoderatedTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3invite_onlyTff7b72=Tffa657boolTb4b4b4(Te6edf3roomTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffinvite_onlyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3topic_ops_onlyTff7b72=Tffa657boolTb4b4b4(Te6edf3roomTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftopic_ops_onlyTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3no_outside_msgsTff7b72=Tffa657boolTb4b4b4(Te6edf3roomTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffno_outside_msgsTa5d6ff"Tb4b4b4, Tff7b72FalseTb4b4b4)Tb4b4b4)Tb4b4b4,
Te6edf3keyTff7b72=Te6edf3roomTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffkeyTa5d6ff"Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffhubsTff7b72.Td2a8ffappendTb4b4b4(Te6edf3hubTb4b4b4)
Tff7b72if Te6edf3hubTff7b72.Td2a8ffenabledTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffsaveTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Te6edf3path Tff7b72= Tff7b72selfTff7b72.Td2a8ff_store_pathTb4b4b4(Tb4b4b4)
Te6edf3tmp_path Tff7b72= Te6edf3path Tff7b72+ Ta5d6ff"Ta5d6ff.tmpTa5d6ff"
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_save_lockTb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3entries Tff7b72= Tb4b4b4[Te6edf3hubTff7b72.Td2a8ffconfig_entryTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3hub Tff7b72in Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4]
Te6edf3osTff7b72.Td2a8ffmakedirsTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_server_dirTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3exist_okTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72with Tffa657openTb4b4b4(Te6edf3tmp_pathTb4b4b4, Ta5d6ff"Ta5d6ffwbTa5d6ff"Tb4b4b4) Tff7b72as Te6edf3fTb4b4b4:
Te6edf3fTff7b72.Td2a8ffwriteTb4b4b4(Te6edf3protoTff7b72.Td2a8ffencodeTb4b4b4(Tb4b4b4{Ta5d6ff"Ta5d6ffhubsTa5d6ff"Tb4b4b4: Te6edf3entriesTb4b4b4}Tb4b4b4)Tb4b4b4)
Te6edf3fTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8fffsyncTb4b4b4(Te6edf3fTff7b72.Td2a8fffilenoTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3osTff7b72.Td2a8ffreplaceTb4b4b4(Te6edf3tmp_pathTb4b4b4, Te6edf3pathTb4b4b4)
Tff7b72except Tf85149ExceptionTb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3osTff7b72.Td2a8ffunlinkTb4b4b4(Te6edf3tmp_pathTb4b4b4)
Tff7b72def Td2a8ffto_dictTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e"""Return a JSON-serializable summary of all hosted hubs."""
Tff7b72with Tff7b72selfTff7b72.Td2a8ff_lockTb4b4b4:
Te6edf3hubs Tff7b72= Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4)
Tff7b72return Tb4b4b4{Ta5d6ff"Ta5d6ffhubsTa5d6ff"Tb4b4b4: Tb4b4b4[Te6edf3hubTff7b72.Td2a8ffto_dictTb4b4b4(Tb4b4b4) Tff7b72for Te6edf3hub Tff7b72in Te6edf3hubsTb4b4b4]Tb4b4b4}
Tff7b72def Td2a8ffshutdownTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72for Te6edf3hub Tff7b72in Tffa657listTb4b4b4(Tff7b72selfTff7b72.Td2a8ffhubsTb4b4b4)Tb4b4b4:
Tff7b72with Te6edf3contextlibTff7b72.Td2a8ffsuppressTb4b4b4(Tf85149ExceptionTb4b4b4)Tb4b4b4:
Te6edf3hubTff7b72.Td2a8ffstopTb4b4b4(Tb4b4b4)
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────